package com.zyl.blog.common.strategy;

import com.zyl.blog.common.annotation.Sensitive;

/**
 * 银行卡号脱敏策略
 * 保留前6位和后4位，中间用*填充，每4位一组用空格分隔
 * 例如：6222 02** **** 1234
 * @version v1.0
 * @ProjectName: Personal_Blog_Server
 * @Package: com.zyl.blog.common.strategy
 * @ClassName: BankCardSensitiveStrategy
 * @Author FinalFantasy
 * @Date 2025/9/8-10:43
 */
public class BankCardSensitiveStrategy extends AbstractSensitiveStrategy {

    /**
     * 银行卡号脱敏实现
     * 保留前6位和后4位，中间用*填充，保持卡号的分组格式
     */
    @Override
    public String desensitize(String value, Sensitive annotation) {
        if (value == null || value.isEmpty()) {
            return value;
        }

        // 移除所有空格，处理原始卡号
        String original = value.replaceAll(" ", "");

        // 如果注解中指定了前缀和后缀长度，则使用注解配置，否则使用默认值
        int prefixLen = annotation.prefixLen() > 0 ? annotation.prefixLen() : 6;
        int suffixLen = annotation.suffixLen() > 0 ? annotation.suffixLen() : 4;

        // 调用父类的mask方法进行基础脱敏
        String masked = mask(original, prefixLen, suffixLen, annotation.maskChar());

        // 重新添加空格分组，保持银行卡号的显示格式
        StringBuilder formatted = new StringBuilder();
        for (int i = 0; i < masked.length(); i++) {
            if (i != 0 && i % 4 == 0) {
                formatted.append(" ");
            }
            formatted.append(masked.charAt(i));
        }

        return formatted.toString();
    }
}